import pdfplumber
import re
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
import pandas as pd


# 检查文泉驿正黑字体是否可用，如果不可用则使用黑体
if 'WenQuanYi Zen Hei' not in [f.name for f in fm.fontManager.ttflist]:
    plt.rcParams['font.sans-serif'] = ['SimHei']
else:
    plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']


class AnnualReportAnalyzer:
    def __init__(self, pdf_path):
        self.pdf_path = pdf_path
        self.text = None

    def extract_text_from_pdf(self):
        """
        从指定的PDF文件中提取文本内容，去除简单的页眉页脚信息。

        :return: 提取到的文本内容，如果提取失败返回None
        """
        try:
            with pdfplumber.open(self.pdf_path) as pdf:
                text = ""
                for page in pdf.pages:
                    # 简单去除页眉页脚（假设页眉页脚在固定位置，实际可能需调整）
                    page_text = page.crop((0, 50, page.width, page.height - 20)).extract_text()
                    text += page_text + "\n"
                self.text = text
            return self.text
        except FileNotFoundError:
            print(f"指定的PDF文件 {self.pdf_path} 不存在，请检查文件路径是否正确。")
            return None
        except Exception as e:
            print(f"打开PDF文件时出现其他错误: {e}")
            return None

    def get_key_info_from_text(self):
        """
        从提取的文本中简单提取关键信息示例（实际可完善提取逻辑）。

        :return: 包含关键信息的字典，如果文本未提取则返回None
        """
        if self.text is None:
            print("请先提取文本内容，无法进行关键信息提取。")
            return None
        key_info = {
            "公司业绩亮点": "茅台酒销量稳健增长，系列酒营收提升显著，品牌价值持续攀升。",
            "重大风险提示": "原材料供应受自然因素影响存在波动风险，白酒行业竞争加剧。",
            "行业发展趋势": "白酒行业消费升级趋势延续，酱香型白酒市场热度较高。",
            "公司战略规划": "坚守品质核心，拓展国内外市场，加强品牌文化建设与数字化转型。"
        }
        return key_info

    def calculate_growth_rates(self):
        """
        计算营收和净利润的增长率。

        :return: 包含营收增长率列表和净利润增长率列表的元组
        """
        if self.text is None:
            print("请先提取文本内容，无法进行增长率计算。")
            return [], []
        try:
            # 提取历年营收数据
            revenue_data = re.findall(r"营业收入\s+(\d+\.\d+|\d+)", self.text)
            revenue_growth_rates = []
            for i in range(1, len(revenue_data)):
                growth_rate = ((float(revenue_data[i]) - float(revenue_data[i - 1])) / float(revenue_data[i - 1])) * 100
                revenue_growth_rates.append(growth_rate)

            # 提取历年净利润数据
            net_profit_data = re.findall(r"净利润\s+(\d+\.\d+|\d+)", self.text)
            net_profit_growth_rates = []
            for i in range(1, len(net_profit_data)):
                growth_rate = ((float(net_profit_data[i]) - float(net_profit_data[i - 1])) / float(net_profit_data[i - 1])) * 100
                net_profit_growth_rates.append(growth_rate)

            return revenue_growth_rates, net_profit_growth_rates
        except Exception as e:
            print(f"在计算增长率时出现错误: {e}")
            return [], []

    def plot_revenue_trend(self):
        """
        绘制营业收入变化趋势图。
        """
        revenue_data = [float(x) for x in re.findall(r"营业收入\s+(\d+\.\d+|\d+)", self.text)]
        try:
            years = range(2019, 2024)  # 根据实际数据年份范围调整
            plt.plot(years, revenue_data)
            plt.xlabel('年份')
            plt.ylabel('营业收入（亿元）')
            plt.title('茅台营业收入变化趋势')
            plt.show()
        except Exception as e:
            print(f"绘制营收趋势图时出现错误: {e}")

    def create_industry_data_table(self):
        """
        创建同行业公司数据对比表格。

        :return: DataFrame格式的行业数据表，如果出现错误返回None
        """
        revenue_data = [float(x) for x in re.findall(r"营业收入\s+(\d+\.\d+|\d+)", self.text)]
        net_profit_data = [float(x) for x in re.findall(r"净利润\s+(\d+\.\d+|\d+)", self.text)]
        try:
            industry_data = {
                '茅台': {
                    '营收': revenue_data[-1],
                    '净利润': net_profit_data[-1],
                    '毛利率': 90.0  # 示例数据，需替换为真实数据
                },
                '五粮液': {
                    '营收': 2.3,
                    '净利润': 30,
                    '毛利率': 75.8
                },
                '泸州老窖': {
                    '营收': 1.2,
                    '净利润': 132,
                    '毛利率': 70.0
                }
            }
            df = pd.DataFrame(industry_data).transpose()
            print(df)
            return df
        except Exception as e:
            print(f"创建行业数据表时出现错误: {e}")
            return None

    def plot_revenue_comparison_pie(self):
        """
        绘制茅台与其他同类企业营收对比的饼状图。
        """
        revenue_data = [float(x) for x in re.findall(r"营业收入\s+(\d+\.\d+|\d+)", self.text)]
        try:
            companies = ['茅台', '五粮液', '泸州老窖']
            revenues = [revenue_data[-1], 2.3, 1.2]  # 这里使用示例数据，实际需替换为真实数据
            plt.pie(revenues, labels=companies, autopct='%1.1f%%')
            plt.title('茅台与同类企业营收对比')
            plt.show()
        except Exception as e:
            print(f"绘制营收对比饼状图时出现错误: {e}")


# 使用示例
pdf_path ='maotai_2023.pdf'
analyzer = AnnualReportAnalyzer(pdf_path)
text = analyzer.extract_text_from_pdf()
if text:
    key_info = analyzer.get_key_info_from_text()
    revenue_growth_rates, net_profit_growth_rates = analyzer.calculate_growth_rates()
    analyzer.plot_revenue_trend()
    industry_table = analyzer.create_industry_data_table()
    analyzer.plot_revenue_comparison_pie()